package jdbctemplate;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 使用 Spring 提供的 JdbcTemplate 来进行数据库操作的流程：
 * 1.构造和数据表相对应的 Bean 类
 * 2.构造这个 Bean 的 Mapper 类，用于和 Bean 形成映射关系
 * 3.定义这个 Bean 的操作接口，里面都是关于这个 Bean 的各种骚操作
 * 4.构造一个自定义类（操作对象）实现上一步构造的接口，这个类中必须要有 DataSource 和 JdbcTemplate 两个类
 * 前者由 Spring 框架中提供；后者是依靠前者进行构造，并通过他使用 JDBC 的原始方式实现各种数据库操作
 * 5.构造配置文件 配置文件中要进行数据库连接初始化，这里出现了字符编码问题，时区问题，SSL 连接问题，具体看参数配置
 * 6.在 Main 中，通过 Spring 得到第四步构建的操作对象，使用它来进行各种真正的骚操作
 * 7.当需要使用存储过程时，通过 DataSource 构造 SimpleJdbcCall, 构造时需要绑定存储过程的方法名，调用时通过这个 Call 进行调用
 * 8.事务的支持，有编程式和声明式两种
 * 编程式的使用方式是通过DataSource 来构造一个 TransactionManager，新建一个 TransactionDefinition，事务管理器通过这个 TransactionDefinition
 * 得到 TransactionStatus, 最后通过 TransactionManager 和 TransactionStatus 进行事务管理
 * 声明式：
 *  1.通过 XML 方式
 *      -构造事务管理器
 *      -配置事务的增强，
 *      -配置事务的切入点
 *  2.通过事务注解的方式
 *      -构造事务管理器
 *      -开启事务注解
 *      -<tx:annotation-driven transaction-manager="transactionManager"/>
 *      -在需要事务支持的类或者方法上加上 @Transactional 注解
 * 总结完毕
 */
public class JdbcTemplateMain {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("jdbctemplate/JdbcBean.xml");
        jdbctemplate.StudentJdbcTemplate studentJdbcTemplate = (StudentJdbcTemplate) context.getBean("customJdbcUtil");

//        studentJdbcTemplate.createStudent("小明", 20);
//        studentJdbcTemplate.createStudent("小红", 18);
//        studentJdbcTemplate.createStudent("小王", 16);
//
//        Student student = studentJdbcTemplate.getStudent(3);
//        System.out.println(student.toString());
//
//        studentJdbcTemplate.updateStudent(2, "小红红", 30);
//        student = studentJdbcTemplate.getStudent(2);
//        System.out.println(student.toString());
//
//        studentJdbcTemplate.deleteStudent(2);
//
//        List<Student> listStudent = studentJdbcTemplate.getStudentList();
//        for (Student student1: listStudent) {
//            System.out.println(student1.toString());
//        }
//
//        studentJdbcTemplate.getCountById(5);

//        studentJdbcTemplate.insertNewStudentWithTransactionManager();

        studentJdbcTemplate.insertNewStudentWithAop();
    }
}
